package com.push;

import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import cn.jpush.api.JPushClient;
import cn.jpush.api.common.resp.APIConnectionException;
import cn.jpush.api.common.resp.APIRequestException;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.PushPayload.Builder;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.audience.AudienceTarget;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;

/**
 * 极光推送工具类
 * 
 * @author ZhangYuhang
 * @date 2016年9月27日 下午1:56:55
 * 
 */
public class JPushUtil {
	private final static Logger logger = Logger.getLogger(JPushUtil.class);
	private static final String MASTER_SECRET = "04d767747bf5d8a03f1de15e";
	private static final String APP_KEY = "85aef5767c1038f80d8bd686";
	private static final String JPUSH_PRODUCT_FLG = "0";
	private static PushPayload pushPayload;
	private static Builder builder;
	private static boolean productFlg;
	static {
		if(StringUtils.equals(JPUSH_PRODUCT_FLG, "1")){
			productFlg = true;
		}else{
			productFlg = false;
		}
		builder = PushPayload.newBuilder();
		pushPayload = builder.setNotification(Notification.alert("")).setAudience(Audience.all())
				.setPlatform(Platform.all()).setOptions(Options.newBuilder().setTimeToLive(0L).build()).build();
	}
	public static final String BEEN_CONCERNED_ALERT = "您有一个新粉丝";

	public static final String SOUND = "default.mp3";

	public static final int BADGE = 1;

	public static void main(String[] args) {
		PushPayload payload = buildPushObjectAliasAlert("张宇航的报销申请待您审批<br>所在部门： Java<br>报销金额（元）：<br>报销类别：dfd<br><font color='#ff3333'>待审批</font>", "jpush_alias1");
		JPushClient jPushClient = new JPushClient("8b5ae783e791ebae94cf9f20", "f474986db538c2b652d575e5");
		try {
			PushResult pushResult = jPushClient.sendPush(payload);
			// TODO zyh
			System.out.println("返回结果" + pushResult);
			logger.info("返回结果" + pushResult);
		} catch (APIConnectionException e) {
			e.printStackTrace();
			logger.error("连接错误，稍后尝试" + e);
		} catch (APIRequestException e) {
			e.printStackTrace();
			logger.error("极光推送内部错误", e);
			logger.info("网络请求状态" + e.getStatus());
			logger.info("错误状态码" + e.getErrorCode());
			logger.info("错误信息" + e.getErrorMessage());
			logger.info("信息ID" + e.getMsgId());
			logger.info("极光推送错误信息:" + e.getErrorMessage());
		}
		System.out.println("推送成功");
	}

	/**
	 * 消息推送
	 * 
	 * @param params
	 *            业务参数
	 * @param alert
	 *            消息内容
	 * @param alias
	 *            别名
	 * @author ZhangYuhang
	 * @date 2016年9月29日 下午1:42:29
	 */
	public static void sendPush(Map<String, String> params, String alert, String... alias) {
		PushPayload payload = buildPushObjectAllAliasAlert(params, alert, "", alias);
		sendPushTryCatch(payload);
	}

	/**
	 * 消息推送
	 * 
	 * @param payload
	 * @return
	 * @throws APIConnectionException
	 * @throws APIRequestException
	 * @author ZhangYuhang
	 * @date 2016年9月27日 下午3:02:34
	 */
	public static PushResult sendPush(PushPayload payload) throws APIConnectionException, APIRequestException {
		JPushClient jPushClient = new JPushClient(MASTER_SECRET, APP_KEY);
		return jPushClient.sendPush(payload);
	}

	/**
	 * 消息推送
	 * 
	 * @param payload
	 * @author ZhangYuhang
	 * @date 2016年9月27日 下午3:03:04
	 */
	public static void sendPushTryCatch(PushPayload payload) {
		JPushClient jPushClient = new JPushClient(MASTER_SECRET, APP_KEY);
		try {
			PushResult pushResult = jPushClient.sendPush(payload);
			logger.info("返回结果" + pushResult);
		} catch (APIConnectionException e) {
			logger.error("连接错误，稍后尝试" + e);
		} catch (APIRequestException e) {
			logger.error("极光推送内部错误", e);
			logger.info("网络请求状态" + e.getStatus());
			logger.info("错误状态码" + e.getErrorCode());
			logger.info("错误信息" + e.getErrorMessage());
			logger.info("信息ID" + e.getMsgId());
			logger.info("极光推送错误信息:" + e.getErrorMessage());
		}
	}

	/**
	 * 快捷地构建推送对象：所有平台，所有设备，内容为 alert 的通知
	 * 
	 * @param alert
	 * @return
	 * @author ZhangYuhang
	 * @date 2016年9月27日 下午3:06:00
	 */
	@SuppressWarnings("static-access")
	public static PushPayload buildPushObjectAllAllAlert(String alert) {
		return pushPayload.alertAll(alert);
	}

	/**
	 * 所有平台，推送目标是别名为 alias，通知内容为 alert
	 * 
	 * @param alert
	 * @param alias
	 * @return
	 * @author ZhangYuhang
	 * @date 2016年9月27日 下午3:06:32
	 */
	public static PushPayload buildPushObjectAliasAlert(String alert, String... alias) {
		return builder
				.setPlatform(Platform.android_ios())
				.setAudience(Audience.alias(alias))
				.setNotification(
						Notification
								.newBuilder()
								.setAlert(alert)
								.addPlatformNotification(AndroidNotification.newBuilder().addExtra("sign", "5").build())
								.addPlatformNotification(IosNotification.newBuilder().addExtra("sign", "5").build())
								.build()).build();
	}

	/**
	 * iOS推送 badge sound
	 * 
	 * @param params
	 * @param alias
	 * @param alert
	 * @param badge
	 * @param sound
	 * @param msgContent
	 * @return
	 * @author ZhangYuhang
	 * @date 2016年9月27日 下午5:17:55
	 */
	public static PushPayload buildPushObjectIosAndroid(Map<String, String> params, String[] alias, String alert,
			int badge, String sound, String msgContent) {
		return builder
				.setPlatform(Platform.android_ios())
				.setAudience(Audience.alias(alias))
				.setNotification(
						Notification
								.newBuilder()
								.addPlatformNotification(
										IosNotification.newBuilder().setAlert(alert).setBadge(badge).addExtras(params)
												.setSound(sound).build())
								.addPlatformNotification(
										AndroidNotification.newBuilder().setAlert(alert).addExtras(params).build())
								.build()).setMessage(Message.newBuilder().setMsgContent(msgContent).build()).build();
	}

	/**
	 * 所有平台，推送目标是别名为 alias，通知标题为 title，通知内容为 alert
	 * 
	 * @param params
	 * @param alert
	 * @param title
	 * @param alias
	 * @return
	 * @author ZhangYuhang
	 * @date 2016年9月27日 下午5:18:10
	 */
	public static PushPayload buildPushObjectAllAliasAlert(Map<String, String> params, String alert, String title,
			String... alias) {
		return builder
				.setPlatform(Platform.android_ios())
				.setAudience(Audience.alias(alias))
				.setNotification(
						Notification
								.newBuilder()
								.setAlert(alert)
								.addPlatformNotification(
										AndroidNotification.newBuilder().setTitle(title).addExtras(params).build())
								.addPlatformNotification(IosNotification.newBuilder().addExtras(params).build())
								.build()).setOptions(Options.newBuilder().setApnsProduction(productFlg).build()).build();
	}

	/**
	 * 平台是 Android，目标是 tag 为 tag 的设备，内容是 Android 通知 alert，并且标题为 title
	 * 
	 * @param tag
	 * @param alert
	 * @param title
	 * @return
	 * @author ZhangYuhang
	 * @date 2016年9月27日 下午5:18:20
	 */
	public static PushPayload buildPushObjectAndroidTagAlertWithTitle(String tag, String alert, String title) {
		return builder.setPlatform(Platform.android()).setAudience(Audience.tag(tag))
				.setNotification(Notification.android(alert, title, null)).build();
	}

	/**
	 * 构建推送对象：平台是 iOS，推送目标是 tag, tagAll 的交集， 推送内容同时包括通知与消息 - 通知信息是 alert，角标数字为
	 * number， 消息内容是 msgContent。 通知是 APNs 推送通道的，消息是 JPush 应用内消息通道的。 APNs
	 * 的推送环境是“开发”（如果不显式设置的话，Library 会默认指定为开发） True 表示推送生产环境，False 表示要推送开发环境
	 * 
	 * @param tag
	 * @param tagAll
	 * @param number
	 * @param alert
	 * @param msgContent
	 * @return
	 * @author ZhangYuhang
	 * @date 2016年9月27日 下午5:18:36
	 */
	public static PushPayload buildPushObjectIosTagAndAlertWithExtrasAndMessage(String tag, String tagAll, int number,
			String alert, String msgContent) {
		return builder
				.setPlatform(Platform.ios())
				.setAudience(Audience.tag_and(tag, tagAll))
				.setNotification(
						Notification
								.newBuilder()
								.addPlatformNotification(
										IosNotification.newBuilder().setAlert(alert).setBadge(number).build()).build())
				.setMessage(Message.content(msgContent))
				.setOptions(Options.newBuilder().setApnsProduction(false).build()).build();
	}

	/**
	 * 构建推送对象：平台是 Andorid 与 iOS， 推送目标是 （tag1 与 tag2 的并集）， 推送内容是 - 内容为 msgContent
	 * 的消息
	 * 
	 * @param tag1
	 * @param tag2
	 * @param msgContent
	 * @return
	 * @author ZhangYuhang
	 * @date 2016年9月27日 下午5:18:51
	 */
	public static PushPayload buildPushObjectIosAudienceMoreMessageWithExtras(String tag1, String tag2,
			String msgContent) {
		return builder.setPlatform(Platform.android_ios())
				.setAudience(Audience.newBuilder().addAudienceTarget(AudienceTarget.tag(tag1, tag2)).build())
				.setMessage(Message.newBuilder().setMsgContent(msgContent).build()).build();
	}
}
